home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 #1 / Ham Radio 2000.iso / ham2000 / packet / terminal / gp161b / conv.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1993-10-05  |  8.4 KB  |  376 lines

  1. {$M 1024,0,0}
  2. {$A+,B-,D-,E-,F-,G-,I-,L-,N-,O-,R-,S-,V+,X+}
  3.  
  4. PROGRAM Conv;   { Convers für GP }
  5.  
  6.  
  7. USES Dos,GPRI;
  8.  
  9. CONST
  10.   LineLength           = 78;
  11.   GPConvers            = 0;
  12.   Version              = '1.01';
  13.   OK                   = '#OK#';
  14.   CR                   = #13;
  15.   SendConversMessage   = 0;
  16.   GetAllConversUsers   = 1;
  17.   GetChannelUsers      = 2;
  18.   SendPrivateMessage   = 3;
  19.   HelpStr1             = #13'*** convers help:'#13+
  20.                             ' /CHannel <n>   or'#13+
  21.                             ' /<n>           switch to channel <n>'#13+
  22.                             ' /Disconnect    disconnects the qso'#13+
  23.                             ' /Help          This text'#13;
  24.  
  25.   HelpStr2             =    ' /MSG <call>    Sends a private msg to <call>'#13+
  26.                             ' /Quit          Terminates the convers session'#13+
  27.                             ' /Who           List of all logged in stations'#13+
  28.                             '***'#13#13;
  29.  
  30.  
  31. TYPE
  32.   Str10         = String[10];
  33.   ConversData   = RECORD
  34.                     FNr,
  35.                     Chan   : Word;
  36.                     Data   : String;
  37.                     ToCall : Str10;
  38.                   END;
  39.  
  40.  
  41.  
  42. VAR
  43.   ConversKanal    : Word;
  44.   QSOData         : QSODataType;
  45.   RightVersion    : Boolean;
  46.  
  47.  
  48.  
  49. PROCEDURE Parse (VAR S : String; Sysop : Boolean); Forward;
  50.  
  51.  
  52.  
  53. FUNCTION FormatString (Header : Str10; S : String) : String;
  54.  
  55. VAR
  56.   P  : Byte;
  57.  
  58. BEGIN
  59.   S := Concat(Header,S);
  60.   IF Byte(S[0]) > LineLength THEN BEGIN
  61.     P := LineLength;
  62.     WHILE (P > 0) AND (String(S)[P] <> ' ') DO Dec(P);
  63.     IF P > 0 THEN BEGIN
  64.       Delete(String(S),P,1);
  65.       Insert(#13+Header,String(S),P);
  66.     END;
  67.   END;
  68.   FormatString := S;
  69. END;
  70.  
  71.  
  72.  
  73. PROCEDURE UpdateUserList (VAR D : ConversData);
  74.  
  75. VAR
  76.   S   : Str10;
  77.  
  78. BEGIN
  79.   Str(ConversKanal:6,S);
  80.   WITH D DO
  81.     IF (FNr = GetAllConversUsers) OR (Chan = ConversKanal) THEN
  82.       Data := Concat(Data,S,':',QSOData.Call,CR);
  83. END;
  84.  
  85.  
  86.  
  87. PROCEDURE SysopMessage (VAR S : String); far;
  88.  
  89. VAR
  90.   D   : ConversData;
  91.  
  92. BEGIN
  93.   IF S[1] = '/' THEN
  94.     Parse(S,TRUE)
  95.   ELSE BEGIN
  96.     WITH D DO BEGIN
  97.       Data := FormatString('-'+QSOData.MyCall+'-:',S);
  98.       Chan := ConversKanal;
  99.       FNr := SendConversMessage;
  100.     END;
  101.     SendGPRIMessage(GPConvers,D);
  102.     SendString(D.Data);
  103.   END;
  104.   S := '';
  105. END;
  106.  
  107.  
  108. PROCEDURE GetPrivateMsg (VAR D : ConversData);
  109.  
  110. BEGIN
  111.   WITH D DO
  112.     IF ToCall = QSOData.Call THEN BEGIN
  113.       SendString(Data);
  114.       ToCall := OK;
  115.     END;
  116. END;
  117.  
  118.  
  119.  
  120. PROCEDURE GetConversMessage (Ident : Word; VAR D : ConversData); far;
  121.  
  122. BEGIN
  123.   IF Ident = GPConvers THEN WITH D DO BEGIN
  124.     CASE FNr OF
  125.       SendConversMessage : IF Chan = ConversKanal THEN SendString(Data);
  126.       GetAllConversUsers : UpdateUserList(D);
  127.       GetChannelUsers    : UpdateUserList(D);
  128.       SendPrivateMessage : GetPrivateMsg(D);
  129.     END;
  130.   END;
  131. END;
  132.  
  133.  
  134.  
  135. PROCEDURE UserListe (Mode : Word);
  136.  
  137. VAR
  138.   D   : ConversData;
  139.   S   : Str10;
  140.  
  141. BEGIN
  142.   Str(ConversKanal:6,S);
  143.   WITH D DO BEGIN
  144.     Data := Concat('*** convers users:'#13,S,':',QSOData.MyCall,' (SysOp)',CR);
  145.     Chan := ConversKanal;
  146.     FNr := Mode;
  147.   END;
  148.   UpdateUserList(D);
  149.   SendGPRIMessage(GPConvers,D);
  150.   SendString(D.Data);
  151.   SendString('***'#13#13);
  152. END;
  153.  
  154.  
  155.  
  156. PROCEDURE Login (Chan : Word);
  157.  
  158. VAR
  159.   D  : ConversData;
  160.   S  : Str10;
  161.  
  162. BEGIN
  163.   Str(Chan,S);
  164.   IF Chan <> ConversKanal THEN BEGIN
  165.     WITH D DO BEGIN
  166.       FNr := SendConversMessage;
  167.       Data := Concat('-',QSOData.Call,'- *** switched to channel ',S,CR);
  168.       Chan := ConversKanal;
  169.     END;
  170.     SendGPRIMessage(GPConvers,D);
  171.     SendString('*** now on channel '+S+CR);
  172.   END;
  173.   ConversKanal := Chan;
  174.   WITH D DO BEGIN
  175.     FNr := SendConversMessage;
  176.     Data := Concat('-',QSOData.Call,'- *** login',CR);
  177.     Chan := ConversKanal;
  178.   END;
  179.   SendGPRIMessage(GPConvers,D);
  180.   UserListe(GetChannelUsers);
  181. END;
  182.  
  183.  
  184.  
  185. PROCEDURE GrossSchrift (VAR S);
  186.  
  187. VAR
  188.   L : Byte;
  189.  
  190. BEGIN
  191.   FOR L := 1 TO Byte(S) DO String(S)[L] := UpCase(String(S)[L]);
  192. END;
  193.  
  194.  
  195.  
  196. FUNCTION BefehlErkannt (Befehl,S : String; Min : Byte) : Boolean;
  197.  
  198. VAR
  199.   I,N      : Byte;
  200.   Gefunden : Boolean;
  201.  
  202. BEGIN
  203.   GrossSchrift(S);
  204.   Gefunden := FALSE;
  205.   I := Min;
  206.   WHILE (I <= Byte(Befehl[0])) AND NOT Gefunden DO BEGIN
  207.     Gefunden := (Pos(Copy(Befehl,1,I)+' ',S) = 1) OR (Pos(Copy(Befehl,1,I)+CR,S) = 1);
  208.     Inc(I);
  209.   END;
  210.   BefehlErkannt := Gefunden;
  211. END;
  212.  
  213.  
  214.  
  215.  
  216. PROCEDURE Parse (VAR S : String; Sysop : Boolean);
  217.  
  218. VAR
  219.   Dummy,
  220.   Fehler   : Integer;
  221.   D        : ConversData;
  222.  
  223. BEGIN
  224.   IF (Byte(S[0]) > 0) AND (S[1] = '/') THEN BEGIN
  225.     Delete(S,1,1);
  226.     IF BefehlErkannt('HELP',S,1) THEN BEGIN
  227.       SendString(HelpStr1);
  228.       SendString(HelpStr2);
  229.       Exit;
  230.     END;
  231.     IF BefehlErkannt('WHO',S,1) THEN BEGIN
  232.       UserListe(GetAllConversUsers);
  233.       Exit;
  234.     END;
  235.     IF BefehlErkannt('QUIT',S,1) THEN BEGIN
  236.       SendString(#13'*** convers session terminated. 73...'#13);
  237.       ProgrammEnde := TRUE;
  238.       Exit;
  239.     END;
  240.     IF BefehlErkannt('DISCONNECT',S,1) THEN BEGIN
  241.       SendString(#13'*** convers session terminated. 73...'#13);
  242.       DisconnectChannel;
  243.       Exit;
  244.     END;
  245.     IF BefehlErkannt('CHANNEL',S,2) THEN BEGIN
  246.       Dummy := Pos(' ',S);
  247.       IF Dummy > 0 THEN BEGIN
  248.         Delete(S,1,Dummy);
  249.         Val(Copy(S,1,Byte(S[0])-1),Dummy,Fehler);
  250.         IF (Fehler = 0) THEN BEGIN
  251.           IF Dummy <> ConversKanal THEN
  252.             Login(Dummy)
  253.           ELSE
  254.             SendString('*** already on channel '+S);
  255.         END ELSE
  256.           SendString('*** invalid channel number'#13);
  257.       END ELSE
  258.         SendString('*** argument required.'#13);
  259.       Exit;
  260.     END;
  261.     IF BefehlErkannt('MSG',S,1) THEN BEGIN
  262.       Dummy := Pos(' ',S);
  263.       IF Dummy > 0 THEN BEGIN
  264.         Delete(S,1,Dummy);
  265.         WHILE (S[0] > #0) AND (S[1] = ' ') DO Delete(S,1,1);
  266.         Dummy := Pos(' ',S);
  267.         IF Dummy > 0 THEN BEGIN
  268.           D.ToCall := Copy(S,1,Dummy-1);
  269.           GrossSchrift(D.ToCall);
  270.           WHILE (S[0] > #0) AND (S[1] = ' ') DO Delete(S,1,1);
  271.           IF Sysop THEN
  272.             D.Data := FormatString('*'+QSOData.MyCall+'*:',Copy(S,Dummy+1,Byte(S[0])))
  273.           ELSE
  274.             D.Data := FormatString('*'+QSOData.Call+'*:',Copy(S,Dummy+1,Byte(S[0])));
  275.           D.FNr := SendPrivateMessage;
  276.           D.Chan := 0;
  277.           SendGPRIMessage(GPConvers,D);
  278.           IF D.ToCall <> OK THEN
  279.             SendString('*** station not connected.'#13);
  280.         END ELSE
  281.           SendString('*** where''s the text???'#13);
  282.       END ELSE
  283.         SendString('*** argument required.'#13);
  284.       Exit;
  285.     END;
  286.     SendString(#13'*** unknown convers command.'#13#13);
  287.   END;
  288. END;
  289.  
  290.  
  291.  
  292.  
  293.  
  294. PROCEDURE RX (VAR S : String); far;
  295.  
  296. VAR
  297.   D   : ConversData;
  298.  
  299. BEGIN
  300.   IF S[1] = '/' THEN
  301.     Parse(S,FALSE)
  302.   ELSE BEGIN
  303.     WITH D DO BEGIN
  304.       FNr := SendConversMessage;
  305.       Data := FormatString('-'+QSOData.Call+'-:',S);
  306.       Chan := ConversKanal;
  307.     END;
  308.     SendGPRIMessage(GPConvers,D);
  309.   END;
  310. END;
  311.  
  312.  
  313.  
  314. PROCEDURE Init; far;
  315.  
  316. VAR
  317.   S   : String;
  318.   D   : ConversData;
  319.   P   : Byte;
  320.   F   : Integer;
  321.  
  322. BEGIN
  323.   IF NOT RightVersion THEN BEGIN
  324.     S := CR+'*** GPRI Version 1.1 required.'+CR+CR;
  325.     ProgrammEnde := TRUE;
  326.     SendString(S);
  327.     Exit;
  328.   END ELSE
  329.     S := #13'*** GP-Convers Revision '+Version+'  (C) Ulf Saran, DH1DAE 1993'#13+
  330.             '*** Type /H for help'#13#13;
  331.   SendString(S);
  332.   IF ParamCount > 0 THEN BEGIN
  333.     Val(ParamStr(1),ConversKanal,F);
  334.     IF F > 0 THEN BEGIN
  335.       SendString('*** invalid channel number.'#13);
  336.       ConversKanal := 0;
  337.     END;
  338.   END ELSE
  339.     ConversKanal := 0;
  340.   GetQSOData(QSOData);
  341.   WITH QSOData DO BEGIN
  342.     P := Pos('-',Call);
  343.     IF P > 0 THEN Delete(Call,P,3);  { SSID weglassen }
  344.     P := Pos('-',MyCall);
  345.     IF P > 0 THEN Delete(MyCall,P,3);  { SSID weglassen }
  346.   END;
  347.   Login(ConversKanal);
  348. END;
  349.  
  350.  
  351.  
  352. PROCEDURE Ende; far;
  353.  
  354. VAR
  355.   D  : ConversData;
  356.  
  357. BEGIN
  358.   WITH D DO BEGIN
  359.     Data := Concat('-',QSOData.Call,'- *** logout'#13);
  360.     FNr := SendConversMessage;
  361.     Chan := ConversKanal;
  362.   END;
  363.   SendGPRIMessage(GPConvers,D);
  364. END;
  365.  
  366.  
  367.  
  368. BEGIN
  369.   RightVersion := InstallTXHandler(@SysopMessage) AND
  370.                   InstallGPRIMessageHandler(@GetConversMessage);
  371.   IF NOT TaskInit(@Init,@RX,NIL,@Ende) THEN BEGIN
  372.     Writeln('Kein GPRI-Host gefunden, Programm kann nicht gestartet werden.');
  373.     Halt;
  374.   END;
  375.   Keep(0);
  376. END.